package d5_homework;

import java.io.File;
import java.util.Scanner;

public class ThirdQuestion {
    //用一个静态变量进行记录文件夹的大小-->只需要一个
    public static long DIRECTORY_SIZE;

    public static void main(String[] args) {
        //目标: 能够使用递归调用定义方法,计算文件夹的大小
        //1、创建一个扫描器
        Scanner sc = new Scanner(System.in);
        //提示用户进行输出
        System.out.println("请输入您要计算的文件夹:");
        //接受文件夹
        String dir = sc.next();

        //2、调用方法,进行计算
        System.out.println("您要计算的文件夹大小是: " + calculateDirectorySize(new File(dir))  + "B");
    }

    //directory (计算机文件或程序的)目录
    //calculate 计算
    //size 大小
    //计算文件夹的大小(独立功能独立成方法)
    //1、是否需要返回值-->需要返回文件夹的总大小
    //2、递归调用的出口是什么? --> 就是当该文件夹是一个文件或者是一个空文件夹的时候-->直接进行计算大小返回
    public static long calculateDirectorySize(File dir) {
        //1、做极端判断-->文件夹是null直接计算  文件夹是空也不计算
        if (dir == null || !dir.exists()) {
            //返回-1
            return DIRECTORY_SIZE;//其实这里可以自定义异常记性提醒上层
        }
        //到这里向将文件夹本身的大小进行累加
        DIRECTORY_SIZE += dir.length();//只是获取文件夹的大小/文件的大小
        //到这里证明是该文件路径是存在的
        //2、获取所有的一级文件对象
        File[] files = dir.listFiles();
        //3、再次做极端判断
        if (files == null) {
            //没有权限进行访问
            return DIRECTORY_SIZE;
        }

        //4、就是一个空文件夹的时候
        //直接计算并返回文件夹大小
        if (files.length == 0) {
            DIRECTORY_SIZE += dir.length();
            //并结束方法
            return DIRECTORY_SIZE;
        }

        //5、遍历该文件夹所有的一级文件对象
        for (File file : files) {
            //判断是文件夹还是文件
            if (file.isFile()) {
                //是文件进行计算大小
                DIRECTORY_SIZE += file.length();
            } else {
                //是文件夹进行递归上面的步骤,进行递归
                calculateDirectorySize(file);
            }
        }
        return DIRECTORY_SIZE;
    }

}
